package com.example;

/**
 * @Author loubobooo
 * @Description #114. 二叉树展开为链表
 * @Date 2022/02/24
 */
public class FlattenBinaryTreeToLinkedList {

    static class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
  }

    /**
     * 给你二叉树的根结点 root ，请你将它展开为一个单链表：
     *
     * 展开后的单链表应该同样使用 TreeNode ，其中 right 子指针指向链表中下一个结点，而左子指针始终为 null 。
     * 展开后的单链表应该与二叉树 先序遍历 顺序相同。
     * @param root
     */
    public void flatten(TreeNode root) {
        if(root == null){
            return;
        }
        // 先把左右子树捋直
        flatten(root.left);
        flatten(root.right);
        // 保存右子树
        TreeNode temp = root.right;
        // 把捋直的左子树放到右边
        root.right = root.left;
        // 记得把左子树置空
        //    2          2
        //  /  \  ->  /    \
        // 3    4    3     3
        // 记得把左子树置空
        root.left = null;
        // 找到现在右子树的最后一个node
        while(root.right != null){
            root = root.right;
        }
        // 接上右子树
        root.right = temp;
    }

    public static void main(String[] args) {
//        TreeNode treeNode = new TreeNode(1);
//        treeNode.left = new TreeNode(2);
//        treeNode.right = new TreeNode(5);
//        treeNode.right.right = new TreeNode(6);
//        treeNode.left.left = new TreeNode(3);
//        treeNode.left.right = new TreeNode(4);
//
//        FlattenBinaryTreeToLinkedList f = new FlattenBinaryTreeToLinkedList();
//        f.flatten(treeNode);

    }
}
